package com.xc.hotelmgr.webapi.modules.op.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.xc.hotelmgr.webapi.common.annotation.SysLog;
import com.xc.hotelmgr.webapi.common.utils.RedisUtils;
import com.xc.hotelmgr.webapi.modules.dt.entity.StoreEntity;
import com.xc.hotelmgr.webapi.modules.dt.service.StoreService;
import com.xc.hotelmgr.webapi.modules.mq.service.HotelToMQService;
import com.xc.hotelmgr.webapi.modules.op.cache.GroupPriceCache;
import com.xc.hotelmgr.webapi.modules.op.cache.constant.RedisKey;
import com.xc.hotelmgr.webapi.modules.op.entity.*;
import com.xc.hotelmgr.webapi.modules.op.service.OpOurRateplanPriceService;
import com.xc.hotelmgr.webapi.modules.sys.controller.AbstractController;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.xc.hotelmgr.webapi.modules.op.service.OurRateplanService;
import com.xc.hotelmgr.webapi.common.utils.PageUtils;
import com.xc.hotelmgr.webapi.common.utils.R;



/**
 * 
 *
 * @author kemmy
 * @email kemmy@gmail.com
 * @date 2020-09-29 14:30:31
 */
@EnableAsync
@RestController
@RequestMapping("op/ourrateplan")
@RequiredArgsConstructor
public class OurRateplanController extends AbstractController {

    private final OurRateplanService ourRateplanService;

    private final HotelToMQService hotelToMQService;

    private final OpOurRateplanPriceService opOurRateplanPriceService;

    private final GroupPriceCache groupPriceCache;

    private final StoreService storeService;

    /**
     * 列表
     */
    @SysLog
    @RequestMapping("/list")
    @RequiresPermissions("op:ourrateplan:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = ourRateplanService.queryPage(params);

        return R.ok().put("page", page);
    }


    /**
     * 信息
     */
    @SysLog
    @RequestMapping("/info/{id}")
    @RequiresPermissions("op:ourrateplan:info")
    public R info(@PathVariable("id") Long id){
		OurRateplanEntity ourRateplan = ourRateplanService.sqlQuryById(id);
		Integer ratePlanId = ourRateplan.getId();
        List<OpOurRateplanPriceEntity> opOurRateplanPriceEntities = opOurRateplanPriceService.getAllByRpId(ratePlanId);
        ourRateplan.setOurRateplanPrices(opOurRateplanPriceEntities);
        return R.ok().put("ourRateplan", ourRateplan);
    }

    /**
     * 保存
     */
    @SysLog
    @RequestMapping("/save")
    @RequiresPermissions("op:ourrateplan:save")
    public R save(@RequestBody OurRateplanEntity ourRateplan) {
        HtlGroupDto htlGroupDto = new HtlGroupDto();
        int storeId = ourRateplan.getStoreId();
        htlGroupDto.setStoreId(storeId);
        htlGroupDto.setGroupId(ourRateplan.getGroupId());

        List<OpOurRateplanPriceEntity> ourRateplanPrices = ourRateplan.getOurRateplanPrices();
        List<OpOurRateplanPriceEntity> opOurRateplanPriceEntities = new ArrayList<>();

        ourRateplanService.save(ourRateplan);
        Integer id = ourRateplan.getId();
        for (OpOurRateplanPriceEntity opOurRateplanPrice : ourRateplanPrices) {
            OpOurRateplanPriceEntity opOurRateplanPriceEntity = new OpOurRateplanPriceEntity();
            opOurRateplanPriceEntity.setOurRpId(id);
            opOurRateplanPriceEntity.setChangePriceEnd(opOurRateplanPrice.getChangePriceEnd());
            opOurRateplanPriceEntity.setChangePriceStart(opOurRateplanPrice.getChangePriceStart());
            opOurRateplanPriceEntity.setChargePricePercent(opOurRateplanPrice.getChargePricePercent());
            opOurRateplanPriceEntity.setChargePriceAmount(opOurRateplanPrice.getChargePriceAmount());
            opOurRateplanPriceEntity.setHighestPrice(opOurRateplanPrice.getHighestPrice());
            opOurRateplanPriceEntities.add(opOurRateplanPriceEntity);
        }
        opOurRateplanPriceService.saveOrUpdateBatch(opOurRateplanPriceEntities);

        // redis缓存分组加价
        try {
            Map<String, Object> map = new HashMap<>();
            map.put(id.toString(), JSONObject.toJSONString(opOurRateplanPriceEntities));
            groupPriceCache.addOrUpdate(storeService.getById(storeId).getAppkey(), map);
        }catch (RuntimeException e){
            logger.error(e.getMessage());
            return R.error("分组加价缓存失败");
        }
        return R.ok();
    }

    /**
     * 修改
     */
    @SysLog
    @RequestMapping("/update")
    @RequiresPermissions("op:ourrateplan:update")
    public R update(@RequestBody OurRateplanEntity ourRateplan){
        HtlGroupDto htlGroupDto = new HtlGroupDto();
        Integer RpId = ourRateplan.getId();
        int storeId = ourRateplan.getStoreId();
        htlGroupDto.setStoreId(storeId);
        htlGroupDto.setGroupId(ourRateplan.getGroupId());
        // 数据库查询所有加价
        List<OpOurRateplanPriceEntity> opOurRateplanPriceEntities2 = opOurRateplanPriceService.getAllByRpId(RpId);
        // 保存新的加价
        List<OpOurRateplanPriceEntity> opOurRateplanPriceEntities = new ArrayList<>();
        // 前端提交的加价
        List<OpOurRateplanPriceEntity> opOurRateplanPriceEntities1 = ourRateplan.getOurRateplanPrices();
        // 判断list
        List<Integer> rpIdList = new ArrayList<>();

        for (OpOurRateplanPriceEntity o1:opOurRateplanPriceEntities1) {
            rpIdList.add(o1.getId());
            o1.setOurRpId(RpId);
            opOurRateplanPriceEntities.add(o1);
        }

        for (OpOurRateplanPriceEntity o2:opOurRateplanPriceEntities2) {
            int id = o2.getId();
            if(!rpIdList.contains(id)) {
                opOurRateplanPriceService.removeById(id);
            }
        }

        // redis缓存分组加价
        try {
            Map<String, Object> map = new HashMap<>();
            map.put(RpId.toString(), JSONObject.toJSONString(opOurRateplanPriceEntities));
            groupPriceCache.addOrUpdate(storeService.getById(storeId).getAppkey(), map);
        }catch (RuntimeException e){
            logger.error(e.getMessage());
            return R.error("分组加价缓存失败");
        }

        try {
            ourRateplanService.updateById(ourRateplan);
            opOurRateplanPriceService.saveOrUpdateBatch(opOurRateplanPriceEntities);
        } catch (Exception e) {
            return R.error("保存价格计划失败");
        }
//        hotelToMQService.pullSendGroup(htlGroupDto);
        return R.ok();
    }

    /**
     * 删除
     */
    @SysLog
    @RequestMapping("/delete")
    @RequiresPermissions("op:ourrateplan:delete")
    public R delete(@RequestParam Map<String,Object> params) {
        Integer storeId = Integer.valueOf(params.get("storeId").toString());
        Integer groupId = Integer.valueOf(params.get("groupId").toString());
        Integer ourRatePlanId = Integer.valueOf(params.get("opOurRateplanId").toString());
        hotelToMQService.delRp(storeId, groupId, ourRatePlanId);
        ourRateplanService.removeById(ourRatePlanId);
        opOurRateplanPriceService.delByRpId(ourRatePlanId);

        // redis缓存分组加价
        try {
            String appKey = storeService.getById(storeId).getAppkey();
            groupPriceCache.del(appKey, ourRatePlanId.toString());
        }catch (RuntimeException e){
            logger.error(e.getMessage());
            return R.error("分组加价缓存失败");
        }

        return R.ok();
    }

}
